package com.henu.engineer.dao.mapper.student;

import com.henu.engineer.dao.entity.student.Student;
import com.henu.engineer.dao.mapper.UserXmlMapper;
import org.apache.ibatis.annotations.Mapper;
import org.springframework.dao.DuplicateKeyException;
import org.springframework.stereotype.Repository;

import java.util.List;

/**
 * @author noexcept
 * @date 2021/7/22 17:51
 */
@Mapper
@Repository
public interface StudentXmlMapper extends UserXmlMapper {

    /**
     * 通过学号查询某个学生的信息
     *
     * @return
     */
    public Student selectStudent(String id);

    /**
     * 根据多个学号查找多个学生，如果需要分页，请这样写：
     *<blockquote>
     *     <pre>
     *{@code
     *      PageHelper.startPage(pageNum, pageSize);
     *      studentXmlMapper.selectStudentsById(studentIds);
     *}
     *     </pre>
     *</blockquote>
     * @param studentIds 包含所查所查学生的学号
     * @return
     */
    public List<Student> selectStudentsById(List<String> studentIds);

    /**
     * 查找某个专业的所有同学：如果需要分页：
     *<blockquote>
     *     <pre>
     *{@code
     *      PageHelper.startPage(pageNum, pageSize);
     *      studentXmlMapper.selectStudentsBySpecialization(specialization);
     *}
     *     </pre>
     *</blockquote>
     * @param specialization
     * @return
     */
    public List<Student> selectStudentsBySpecialization(String specialization);

    /**
     * 查找某个年级的所有同学，如果需要分页：
     *<blockquote>
     *     <pre>
     *{@code
     *      PageHelper.startPage(pageNum, pageSize);
     *      studentXmlMapper.selectStudentsByGrade(grade);
     *}
     *     </pre>
     *</blockquote>
     * @param grade 格式：YYYY，例如："2022"
     * @return
     */
    public List<Student> selectStudentsByGrade(String grade);

    /**
     * 查找某专业某年级所有同学,如果需要分页：
     *<blockquote>
     *     <pre>
     *{@code
     *      PageHelper.startPage(pageNum, pageSize);
     *      studentXmlMapper.selectStudentsBySpecAndGrade(specialization,grade);
     *}
     *     </pre>
     *</blockquote>
     * @param specialization
     * @param grade 格式：YYYY，例如："2022"
     * @return
     */
    public List<Student> selectStudentsBySpecAndGrade(String specialization,String grade);

    /**
     * 插入一个学生记录
     *
     * @param student
     * @return
     * @throws DuplicateKeyException : 可能会因为学号相同出现异常
     */
    public boolean insertStudent(Student student) throws DuplicateKeyException;

    /**
     * 插入多位学生
     * @param students
     * @return
     */
    public Integer insertStudents(List<Student> students);

    /**
     * 修改联系方式
     *
     * @param id      学号
     * @param contact 新的联系方式
     * @return 是否成功
     */
    public boolean updateContact(String id, String contact);

    /**
     * 修改专业（可能转专业）
     *
     * @param id
     * @param specialization 新的专业名称
     * @return
     */
    public boolean updateSpecialization(String id, String specialization);
}
